package entidades.politica;

import java.util.ArrayList;
import java.util.Random;

import util.exceptions.NaoExistemPeersSuficientesParaSeFazerTroca;
import entidades.Peer;

public class PoliticaSelecaoVizinhosPorGrupos extends PoliticaSelecaoVizinhos {

	public PoliticaSelecaoVizinhosPorGrupos(ArrayList<Peer> listaPeers) {
		super(listaPeers);
	}

	@Override
	public Peer seleciona(Peer peerOrigem) throws NaoExistemPeersSuficientesParaSeFazerTroca {
		if (super.listaPeers.isEmpty() || super.listaPeers.size() == 1) {
			throw new NaoExistemPeersSuficientesParaSeFazerTroca();
		}

		super.listaPeers.remove(peerOrigem);
		
		Peer peerSelecionado = null;		
		ArrayList<Peer> peersGrupoDiferente = new ArrayList<Peer>();
		
		for (Peer p : super.listaPeers) {
			if (!p.getAssinatura().equalsIgnoreCase(peerOrigem.getAssinatura())) {
				peersGrupoDiferente.add(p);
			}
		}
		
		if (peersGrupoDiferente.isEmpty()) {
			Random random = new Random();
			int pos = random.nextInt(listaPeers.size());
			
			peerSelecionado = listaPeers.get(pos);
		}
		else {
			Random random = new Random();
			int pos = random.nextInt(peersGrupoDiferente.size());
			
			peerSelecionado = peersGrupoDiferente.get(pos);
		}
		
		super.listaPeers.add(peerOrigem);
			
		return peerSelecionado;
		
	}

	@Override
	public Peer seleciona() throws NaoExistemPeersSuficientesParaSeFazerTroca {
		if (listaPeers.isEmpty()) {
			throw new NaoExistemPeersSuficientesParaSeFazerTroca();
		}
		
		Random random = new Random();
		int pos = random.nextInt(listaPeers.size());
		
		return listaPeers.get(pos);
	}

}
